package com.rbn.stockmobiledevices.entradas;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.rbn.stockmobiledevices.dispositivos.Dispositivo;
import com.rbn.stockmobiledevices.proveedores.Proveedor;
import com.rbn.stockmobiledevices.utils.AutoCompleteElement;

@Controller
public class EntradaController {
	
	private EntradaManager entradaManager;
	
	@Autowired 
	public EntradaController(EntradaManager
			entradaManager) {
		this.entradaManager = entradaManager;
	}
	
	@RequestMapping(value="/getEntradaDetail", method=RequestMethod.GET)
	public @ResponseBody Entrada getDetail(@RequestParam long imei) {
		Entrada d = entradaManager.getById(imei);
	    return d;
	}
	
	@RequestMapping(value="/removeEntrada", method=RequestMethod.GET)
	public @ResponseBody Map<String, Boolean> remove(@RequestParam long imei) {
		HashMap<String, Boolean> valueReturn = new HashMap<String, Boolean>();
		boolean result = true;
		try{
			result = entradaManager.remove(imei);
		}catch(Exception e){
			result = false;
		}
		valueReturn.put("status", result);
	    return valueReturn;
	}
	
	@RequestMapping(value="/updateEntrada", method=RequestMethod.GET)
	public @ResponseBody Map<String, Object> update(@RequestParam long imei, @RequestParam String fecha, 
			@RequestParam double precio, @RequestParam String observacion, @RequestParam String dispositivo, @RequestParam int proveedor,
			@RequestParam int estado, @RequestParam boolean pagado) {
		
		HashMap<String, Object> valueReturn = new HashMap<String, Object>();
		boolean result = true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date fechaEntrada = null;
		String mensaje="";
		try{
			fechaEntrada = sdf.parse(fecha);
			Entrada entrada = entradaManager.getById(imei);
			Dispositivo d = entradaManager.getDispositivoById(dispositivo);
			Proveedor p = entradaManager.getProveedorById(proveedor);
			Estado e = entradaManager.getEstadoById(estado);
			entrada.setFechaEntrada(fechaEntrada);
			entrada.setPrecioCompra(precio);
			entrada.setObservacion(observacion);
			entrada.setPagado(pagado);
			if(entrada.getDispositivo()==null || !entrada.getDispositivo().equals(d)){
				entrada.setDispositivo(d);
			}
			if(entrada.getProveedor()==null || !entrada.getProveedor().equals(p)){
				entrada.setProveedor(p);
			}
			if(entrada.getEstado()==null || !entrada.getEstado().equals(e)){
				entrada.setEstado(e);
			}
			entradaManager.update(entrada);
			mensaje = "El ingreso se actualizo correctamente";
		}catch(Exception e){
			result = false;
			mensaje = "Ocurrio un error al intentar eliminar el ingreso";
		}
		valueReturn.put("status", result);
		valueReturn.put("mensaje", mensaje);
	    return valueReturn;
	}
	
	@RequestMapping(value="/addEntrada", method=RequestMethod.GET)
	public @ResponseBody
	Map<String, Object> add(@RequestParam long imei,
			@RequestParam String fecha, @RequestParam double precio,
			@RequestParam String observacion, @RequestParam String dispositivo,
			@RequestParam int proveedor, @RequestParam int estado,
			@RequestParam boolean pagado) {
	HashMap<String, Object> valueReturn = new HashMap<String, Object>();
		boolean result = true;
		String mensaje="";
		Date fechaEntrada = null;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		try{
			fechaEntrada = sdf.parse(fecha);
			Dispositivo d = entradaManager.getDispositivoById(dispositivo);
			Proveedor p = entradaManager.getProveedorById(proveedor);
			Estado e = entradaManager.getEstadoById(estado);
			Entrada entrada = new Entrada();
			entrada.setImei(imei);
			entrada.setFechaEntrada(fechaEntrada);
			entrada.setPrecioCompra(precio);
			entrada.setObservacion(observacion);
			entrada.setPagado(pagado);
			entrada.setDispositivo(d);
			entrada.setProveedor(p);
			entrada.setEstado(e);
			
			entradaManager.save(entrada);
			
			mensaje="<strong>El ingreso se realizo correctamente</strong><br/>"+
				"Imei: " + imei + "<br/>" +
				"Celular: cod(" + d.getCodigo() + ") modelo(" + d.getModelo() + ")<br/>" +
				"Proveedor: " + p.getNombre() + "<br/>" +
				"Precio de Compra: " + precio + "<br/>" +
				"Observaciones: " + observacion + "<br/>" +
				"Fecha de compra: " + fecha;
		}catch (Exception e) {
			result = false;
			mensaje = "<strong>ERROR!!</strong><br/>Ocurrio un error al intentar hacer el ingreso";
		}
		
		valueReturn.put("status", result);
		valueReturn.put("mensaje", mensaje);
		
	    return valueReturn;
	}
	
	@RequestMapping(value = "/pagarEntrada", method = RequestMethod.GET)
	public @ResponseBody Map<String, Object> pagarEntrada(@RequestParam long imei) {
		HashMap<String, Object> valueReturn = new HashMap<String, Object>();
		boolean result = true;
		try{
			Entrada entrada = entradaManager.getById(imei);
			entrada.setPagado(true);
			entradaManager.update(entrada);
		}catch(Exception e){
			result=false;
		}
		valueReturn.put("status", result);
		
		return valueReturn;
	}
	
	
	@RequestMapping(value = "/ingresosHome", method = RequestMethod.GET)
	public String list(Model model) {
		return "entradas.tiles";
	}
	
	@RequestMapping(value = "/entradas", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, Object> list(@RequestParam int iDisplayStart, @RequestParam int iDisplayLength, @RequestParam String sEcho,
			@RequestParam(value="sSearch_0") String flt_imei, 
			@RequestParam(value="sSearch_1") String flt_dispositivo, 
			@RequestParam(value="sSearch_2") Long flt_proveedor, 
			@RequestParam(value="sSearch_3") String flt_fecha) {

		flt_imei=flt_imei!=null?flt_imei.trim():"";
		flt_dispositivo=flt_dispositivo!=null?flt_dispositivo.trim():"";
		
		Map<String, Object> map = new HashMap<String, Object>();
		List<Entrada> entradas = new ArrayList<Entrada>();
		int total = 0;
		int filtered = 0;
		try{
			Date fecha = null;
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
			if(flt_fecha!=null && flt_fecha.length()>0){
				try {
					fecha = sdf.parse(flt_fecha);
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
			entradas = entradaManager.getAll();
			total = entradas.size();
			filtered = total;
			
			
			filtered = entradaManager.getPaginadoEntrada(null, null, flt_imei, flt_dispositivo, flt_proveedor, fecha).size();
			entradas = entradaManager.getPaginadoEntrada(iDisplayStart, iDisplayLength, flt_imei, flt_dispositivo, flt_proveedor, fecha);
		
		}catch(Exception e){
			
		}
		
		map.put("sEcho", sEcho);
		map.put("iTotalRecords", String.valueOf(total));
		map.put("iTotalDisplayRecords", String.valueOf(filtered));
		map.put("entradas", entradas);

		return map;
	}
	
	@RequestMapping(value = "/addEstado", method = RequestMethod.GET)
	public @ResponseBody Map<String, Object> addEstado(@RequestParam String estado) {
		Map<String, Object> valueReturn = new HashMap<String, Object>();
		
		boolean result=true;
		Integer id = null;
		Estado estadoObj = new Estado();
		estadoObj.setEstado(estado);
		try{
			id = entradaManager.saveEstado(estadoObj);
		}catch(Exception e){
			result=false;
			
		}
		valueReturn.put("status", result);
		valueReturn.put("estado_id", id);
		return valueReturn;
	}
	@RequestMapping(value = "/updateEstado", method = RequestMethod.GET)
	public @ResponseBody Map<String, Object> updateEstado(@RequestParam int id, @RequestParam String estado) {
		Map<String, Object> valueReturn = new HashMap<String, Object>();
		boolean result = true;
		Estado estadoObj = entradaManager.getEstadoById(id);
		estadoObj.setEstado(estado);
		try{
			entradaManager.updateEstado(estadoObj);
		}catch(Exception e){
			result=false;
		}
		valueReturn.put("status", result);
		return valueReturn;
	}

	@RequestMapping(value="/removeEstado", method=RequestMethod.GET)
	public @ResponseBody Map<String, Boolean> removeEstado(@RequestParam int id) {
		HashMap<String, Boolean> valueReturn = new HashMap<String, Boolean>();
		boolean result = true;
		
		try{
			result = entradaManager.removeEstado(id);
		}catch(Exception e){
			result = false;
		}
		valueReturn.put("status", result);
	    return valueReturn;
	}

	
	@RequestMapping(value = "/getEstado", method = RequestMethod.GET)
	public @ResponseBody Estado getEstado(@RequestParam int id) {
		return entradaManager.getEstadoById(id);
	}
	
	@RequestMapping(value = "/autoCompleteDispositivo", method = RequestMethod.GET)
	public @ResponseBody List<AutoCompleteElement> findDispositivos(@RequestParam(value="term") String search) {
		List<AutoCompleteElement> lista = entradaManager.getDispositivosOptionsByModelo(search);
		return lista;
	}
	
	@RequestMapping(value = "/autoCompleteProveedor", method = RequestMethod.GET)
	public @ResponseBody List<AutoCompleteElement> findProveedores(@RequestParam(value="term") String search) {
		List<AutoCompleteElement> lista = entradaManager.getProveedorOptionsByModelo(search);
		return lista;
	}
	
	@RequestMapping(value = "/autoCompleteEstado", method = RequestMethod.GET)
	public @ResponseBody List<AutoCompleteElement> findEstados(@RequestParam(value="term") String search) {
		List<AutoCompleteElement> lista = entradaManager.getEstadoOptionsByModelo(search);
		return lista;
	}
}